# asyncio 是 Python 自带的异步工具，用来运行异步任务（LangGraph 也支持异步执行）
import asyncio

# AsyncSqliteSaver：LangGraph 提供的“检查点保存器”，
# 可以把每一步执行结果保存到 SQLite 数据库里。
# 简单理解：它是一个“自动记忆上次执行到哪”的工具。
from langgraph.checkpoint.sqlite.aio import AsyncSqliteSaver

# StateGraph：LangGraph 的核心类，用来定义“计算流程图”
# 图里的每个节点都是一个步骤。
from langgraph.graph import StateGraph


async def main():
    # 创建一个图，这个图处理的数据类型是 int（整数）
    # 比如：输入1，经过处理后输出2
    builder = StateGraph(int)

    # 添加一个节点，名字叫 "add_one"
    # 逻辑很简单：输入一个数 → 返回这个数 + 1
    builder.add_node("add_one", lambda x: x + 1)

    # 设置这个节点是整个流程的“入口”
    builder.set_entry_point("add_one")

    # 同时它也是“结束点”，因为这里只有一个节点
    builder.set_finish_point("add_one")

    # 创建一个 SQLite 检查点存储器
    # 它会把执行状态自动保存到 checkpoints.db 文件里
    # 下次再运行时，可以从上次保存的位置继续。
    async with AsyncSqliteSaver.from_conn_string("llm_langgraph_3_checkpoint_消息存储_sqlite.db") as memory:

        # 编译图，把上面定义好的节点和检查点功能打包成一个可执行的图对象
        graph = builder.compile(checkpointer=memory)

        # 调用图的异步执行方法 ainvoke()
        # 输入值为 1
        # “configurable” 是传递额外配置的地方，比如这里的 thread_id 可以理解成“任务ID”
        result = await graph.ainvoke(1, {"configurable": {"thread_id": "thread-1"}})

        # 打印运行结果
        # 因为节点逻辑是 x + 1，所以结果应该是 2
        print("执行结果：", result)


# asyncio.run 是运行异步任务的快捷方式
# 会自动创建事件循环并执行 main()
asyncio.run(main())
